#include "rationnel.h"

rationnel::rationnel(int num=0,int den=1) throw(DataException): nonComplexe(RATIONNEL){
        if(den == 0)
                throw DataException("Division par 0");
        this->num = num;
        this->den = den;
this->type = RATIONNEL;
}

rationnel::rationnel(const entier& c,const entier& d) throw(DataException): NonComplexe(RATIONNEL){

        if(d.getVal() == 0)
                throw DataException("Division par 0");
this->type = RATIONNEL;

        this->num = static_cast<const entier&>(c).getVal();
        this->den = d.getVal();
}

constante* rationnel::operator+(const constante& c)const{

        switch(c.getType()){
                case constante::ENTIER:
        return *this+rationnel(static_cast<const entier& >(c));
                break;
                case constante::RATIONNEL:
        return new rationnel(this->num*static_cast<const rationnel&>(c).den+static_cast<const rationnel&>(c).num*this->den,
                        this->den*static_cast<const rationnel&>(c).den);
                break;
        }
}

constante* rationnel::operator*(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this*rationnel(static_cast<const entier& >(c));
                break;
                case constante::RATIONNEL:
        return new rationnel(this->num*static_cast<const rationnel&>(c).den-static_cast<const rationnel&>(c).num*this->den,
                        this->den*static_cast<const rationnel&>(c).den);
                break;
        }
}

constante* rationnel::operator-(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this-rationnel(static_cast<const entier& >(c));
                break;
                case constante::RATIONNEL:
        return new rationnel(this->num*static_cast<const rationnel&>(c).den-static_cast<const rationnel&>(c).num*this->den,
                        this->den*static_cast<const rationnel&>(c).den);
                break;
        }
}

constante* rationnel::operator/(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this/rationnel(static_cast<const entier& >(c));
                break;
                case constante::RATIONNEL:
        return new rationnel(this->num*static_cast<const rationnel&>(c).den,
                        this->den*static_cast<const rationnel&>(c).num);
                break;
        }
}

constante* rationnel::operator-()const{
        return new rationnel(-this->num,this->den);
}
